package com.scnu.edu.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.scnu.edu.dto.MovieDTO;
import com.scnu.edu.entity.Category;
import com.scnu.edu.entity.Movie;
import com.scnu.edu.entity.Region;

import java.util.List;
import java.util.Map;

public interface MovieService extends IService<Movie> {
    /**
     * 获取所有电影分类
     * @return 分类列表
     */
    List<Category> getAllCategories();

    /**
     * 获取所有地区
     * @return 地区列表
     */
    List<Region> getAllRegions();

    /**
     * 高级搜索
     * @param keyword 关键词
     * @param categoryId 分类ID
     * @param regionId 地区ID
     * @param sort 排序方式（play_count: 播放量, score: 评分, release_date: 上映时间）
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return 搜索结果
     */
    Map<String, Object> advancedSearch(String keyword, Long categoryId, Long regionId, String creator, String sort, Integer pageNo, Integer pageSize);
    /**
     * 分页查询电影
     * @param title 电影标题（模糊查询）
     * @param category 电影分类
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return 包含分页数据的Map
     */
    Map<String, Object> queryPage(String title, String category, Integer pageNo, Integer pageSize);

    /**
     * 获取本周热播排行
     * @return 电影DTO列表
     */
    List<MovieDTO> getWeeklyRanking();

    /**
     * 获取本月热播排行
     * @return 电影DTO列表
     */
    List<MovieDTO> getMonthlyRanking();

    /**
     * 获取总播放排行
     * @return 电影DTO列表
     */
    List<MovieDTO> getAllTimeRanking();

    /**
     * 获取评分排行
     * @return 电影DTO列表
     */
    List<MovieDTO> getRatingRanking();

    MovieDTO getMovieDTOById(Long movieId);

    /**
     * 获取侧边栏排行榜数据
     * @return 包含周榜、月榜和评分榜的Map
     */
    Map<String, List<MovieDTO>> getSidebarRankings();

    /**
     * 获取导演的其他作品
     * @param directorId 导演ID
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return 包含分页数据的Map
     */
    Map<String, Object> getDirectorMovies(Integer directorId, Integer pageNo, Integer pageSize);

    /**
     * 获取演员的其他作品
     * @param actorId 演员ID
     * @param pageNo 页码
     * @param pageSize 每页大小
     * @return 包含分页数据的Map
     */
    Map<String, Object> getActorMovies(Integer actorId, Integer pageNo, Integer pageSize);

    /**
     * 增加播放次数
     * @param movieId 电影ID
     */
    void incrementPlayCount(Integer movieId);

    List<Movie> findMoviesByActorId(Long actorId);

    List<Movie> findMoviesByDirectorId(Long directorId);

    Map<String, Object> search(String keyword, Integer pageNo, Integer pageSize);

    Object findCategories();
    
    /**
     * 获取电影及其关联的导演和演员信息
     * @param movieId 电影ID
     * @return MovieDTO对象
     */
    MovieDTO getMovieWithRelations(Long movieId);

    /**
     * 更新电影分类关联
     * @param movieId 电影ID
     * @param categoryIds 分类ID列表
     */
    void updateMovieCategories(Long movieId, List<Long> categoryIds);

    /**
     * 获取电影的分类ID列表
     * @param movieId 电影ID
     * @return 分类ID列表
     */
    List<Long> getCategoryIdsByMovieId(Long movieId);
    /**
     * 根据演员获取推荐电影
     * @param actorId 演员ID
     * @return 推荐电影列表
     */
    List<Movie> getRecommendationsByActor(Long actorId);

    /**
     * 根据导演获取推荐电影
     * @param directorId 导演ID
     * @return 推荐电影列表
     */
    List<Movie> getRecommendationsByDirector(Long directorId);
}